package chapter4.homework;

/**
 * @Project ：learn_java
 * @File ：Q2.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/7 18:57
 * @Description ：打印奇数和偶数的两个线程
创建和启动2个子线程，一个打印奇数，一个打印偶数，
（1）要求实现交替打印。
（2）每对数打印间隔1秒

开发提示：
（1）编写一个资源类，例如：Number类，
	包含1个int类型的num，用来记录线程要打印的数字，初始值为1。
	包含1个boolean类型的odd，用来标记是奇数线程打印还是偶数线程打印，true表示奇数线程打印，false表示偶数线程打印。初始化为true。
	包含void printOddNum()方法，判断odd为true，就打印num，之后修改odd为false，然后唤醒偶数线程，之后自己wait。
	包含void printEvenNum()方法，判断odd为false，就打印num，之后修改odd为true，然后唤醒奇数线程，之后自己wait。
（2）在测试类中
	创建Number类对象
	创建一个奇数线程，并启动，重写run方法，循环调用Number类对象的printOddNum()方法。
	创建一个偶数线程，并启动，重写run方法，循环调用Number类对象的printEvenNum()方法。
 */

class Number {
    private int num = 1; // 用来记录线程要打印的数字
    private boolean odd = true; // 用来标记是奇数线程打印还是偶数线程打印

    // 打印奇数的方法
    public synchronized void printOddNum() {
        while (num <= 100) {
            if (odd) {
                System.out.println("奇数线程打印: " + num);
                num++;
                odd = false; // 切换到偶数线程
                notifyAll(); // 唤醒其他线程
            }
            try {
                wait(); // 当前线程等待
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

    // 打印偶数的方法
    public synchronized void printEvenNum() {
        while (num <= 100) {
            if (!odd) {
                System.out.println("偶数线程打印: " + num);
                num++;
                odd = true; // 切换到奇数线程
                notifyAll(); // 唤醒其他线程
            }
            try {
                wait(); // 当前线程等待
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

public class Q2 {
    public static void main(String[] args) {
        Number number = new Number();

        // 创建并启动奇数线程
        Thread oddThread = new Thread(() -> {
            while (true) {
                number.printOddNum();
                try {
                    Thread.sleep(100); // 每对数字之间间隔1秒
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        oddThread.start();

        // 创建并启动偶数线程
        Thread evenThread = new Thread(() -> {
            while (true) {
                number.printEvenNum();
                try {
                    Thread.sleep(100); // 每对数字之间间隔1秒
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        evenThread.start();
    }
}
